import { http } from '@/utils/http'

const AUTH_BASE_URL = '/core/PDAControl'
const inOrOutStockApi = {
  // 获取出入库单下已扫描的数据
  getTStockTranBasketDetailByCode: (code: string) => {
    return http({
      url: `${AUTH_BASE_URL}/getBasketDetailByTranCode?tranCode=${code}`,
      method: 'GET',
    })
  },
  // 获取出入库信息
  getTStockTranHeadList: (params: any) => {
    const query = encodeURIComponent(JSON.stringify({ ...params }))
    return http({
      url: `${AUTH_BASE_URL}/getStockTranList?object=${query}`,
      method: 'GET',
    })
  },
  // 删除出入库信息
  delTStockTranHead: (id: number) => {
    return http({
      url: `${AUTH_BASE_URL}/delTStockTranBasketDetail`,
      method: 'POST',
      data: { id },
    })
  },
  // 新增or更新出入库明细
  saveOrUpdateTStockTranBasketDetail: (params: ScanInStockData) => {
    return http<ScanInStockSuccessData[]>({
      url: `${AUTH_BASE_URL}/saveOrUpdateBasketDetail`,
      method: 'POST',
      data: params,
    })
  },
  // 提交出入库信息
  submitTStockTranHead: (id: number) => {
    return http({
      url: `${AUTH_BASE_URL}/submitStockTran`,
      method: 'POST',
      data: { id },
    })
  },
  // 入库单筐码分组
  groupByBasket: (params: BasketGroupData[]) => {
    return http<any>({
      url: `${AUTH_BASE_URL}/groupByBasket`,
      method: 'POST',
      data: params,
    })
  },
  // 获取出库单建议储位
  getOutLocation: (tranCode: string) => {
    return http<BaseResponse<OutStockRecInLocationData[]>[]>({
      url: `${AUTH_BASE_URL}/getOutLocation`,
      method: 'POST',
      data: {
        tranCode,
      },
    })
  },
  // 判断筐码是否可以分组
  checkGroupBasket: (params: ScanInStockData) => {
    return http<string>({
      url: `${AUTH_BASE_URL}/checkGroupBasket`,
      method: 'POST',
      data: params,
    })
  },
}

export default inOrOutStockApi

// 定义一个接口，用于描述出入库单的详细信息
export interface TransferData {
  /** 分页大小，可选 */
  pageSize?: number
  /** 页码，可选 */
  pageNum?: number
  /** 时间范围，可选 */
  timeScopes?: any // 根据实际情况定义类型
  /** ID */
  id?: number
  /** 代码 */
  code?: string
  /** 前缀，可选 */
  prefix?: string
  /** 生成编号，可选 */
  genNo?: string
  /** 文档类型，可选 */
  docType?: string
  /** 发放日期，可选 */
  issueDate?: Date // 或者 string，根据实际情况
  /** 部门，可选 */
  department?: string
  /** IO代码 */
  iocode?: string
  /** 源分类，可选 */
  sourceCategory?: string
  /** 源代码，可选 */
  sourceCode?: string
  /** 原因 */
  reason?: string
  /** 货币，可选 */
  currency?: string
  /** 汇率，可选 */
  rate?: number
  /** 备注 */
  remark?: string
  /** 状态 */
  status?: number
  /** 创建时间 */
  createTime?: string // 或者 Date，根据实际情况
  /** 创建人名称 */
  createName?: string
  /** 创建人用户ID */
  createUser?: number
  /** 修改时间 */
  modifyTime?: string // 或者 Date，根据实际情况
  /** 修改人名称 */
  modifyName?: string
  /** 修改人用户ID */
  modifyUser?: number
  /** 审批时间，可选 */
  approvalTime?: Date // 或者 string，根据实际情况
  /** 审批人名称，可选 */
  approvalName?: string
  /** 审批人用户ID，可选 */
  approvalUser?: number
  /** 是否删除 */
  isDelete?: number
  /** 仓库交易明细 */
  stockTranDetailList?: TransferOrderItem[]
}

// 入库单详情数据结构
export interface TransferOrderItem {
  /** 分页大小，可选 */
  pageSize?: number
  /** 页码，可选 */
  pageNum?: number
  /** 时间范围，可选 */
  timeScopes?: any // 根据实际情况定义具体类型
  /** 唯一标识 */
  id?: number
  /** 转移单代码 */
  code?: string
  /** 父转移单代码 */
  parentCode?: string
  /** 筐号 */
  basket?: string
  /** 行号，可选 */
  rowSeq?: number
  /** 排序序号，可选 */
  sortSeq?: number
  /** 源代码，可选 */
  sourceCode?: string
  /** 产品代码 */
  productCode?: string
  /** 产品名称 */
  productName?: string
  /** 描述 */
  description?: string
  /** 仓库编号 */
  // warehouse?: string
  location?: string

  /** 批次号，可选 */
  batch?: string
  /** 数量 */
  qty?: number
  /** 单位 */
  unit?: string
  /** 单价，可选 */
  unitPrice?: number
  /** 金额，可选 */
  amount?: number
  /** 创建时间 */
  createTime?: string // 根据需要可以是 Date 类型
  /** 修改时间 */
  modifyTime?: string // 根据需要可以是 Date 类型
  /** 是否删除 */
  isDelete?: number
  locationQty: [
    {
      productCode: string
      location: string
      qty: number
    },
  ]
}

// 入库单已扫描数据
export interface InOrOutStockScanData {
  // 关联编号1
  associationNo1?: string

  // 关联编号2
  associationNo2?: string

  // 关联编号3
  associationNo3?: string

  // 关联编号4
  associationNo4?: string

  // 篮子（可能是某种分类或分组）
  basket?: string

  // 批次号
  batch?: string

  // 代码（可能是产品代码或其他标识）
  code?: string

  // 创建时间
  createTime?: string // 通常这里会使用 Date 类型，但您提供的是字符串格式

  // 文档编号
  docNo?: string

  // 文档类型
  docType?: string

  // 唯一标识符（通常会是数字或字符串）
  id?: number

  // IO代码（可能是输入输出相关的代码）
  iocode?: string

  // 是否删除（0表示未删除，1表示已删除）
  isDelete?: number // 通常这里会使用 boolean 类型

  // 位置
  location?: string

  // 修改时间
  modifyTime?: string // 同 createTime，通常使用 Date 类型

  // 页码（用于分页）
  pageNum?: number

  // 每页大小（用于分页）
  pageSize?: number

  // 父级代码（可能是层级关系中的上级代码）
  parentCode?: string

  // 是否已发布（0表示未发布，1表示已发布）
  posted?: number // 通常这里也会使用 boolean 类型

  // 产品代码
  productCode?: string

  // 产品名称
  productName?: string

  // 数量
  qty?: number

  // 行序号
  rowSeq?: number

  // 序列号
  serialNo?: string

  // 时间范围（数组，可能包含多个时间字符串）
  timeScopes?: string[]

  // 交易代码
  tranCode?: string

  // 仓库
  warehouse?: string
}

// 筐码分组传参数组
export interface BasketGroupData {
  basket: string // 篮子

  tranCode: string // 入库单

  productName?: string
  qty?: number
  productCode?: string
  flag?: boolean
}

// 扫码入库传参数
export interface ScanInStockData {
  basket: string // 篮子
  productCode: string // 产品代码
  productName: string // 产品名称
  location?: string // 位置
  qty: number // 数量
  tranCode: string // 入库单
}

// 扫筐码入库成功返回数据结构
export interface ScanInStockSuccessData {
  basket: string
  code: string
  id: number
  location: string
  parentCode: string
  productCode: string
  productName: string
  qty: number
  tranCode: string
}

// 出库单建议储位返回数据结构(原始)
export interface BaseResponse<T> {
  msg: string
  data: T
  code: number
}
export interface OutStockRecInLocationData {
  basket: string
  location: string
  productCode: string
  productName: string
  qty: number
  status: number
  unit: string
  warehouse: string
}

// 出库建议储位数据结构（转换）
export interface OutStockRecInLocationDataV2 {
  productCode: string
  productName: string
  locations: {
    basket: string
    location: string
    qty: number
  }[]
}
